package com.zys.el.user.util.TFIDF;

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 词频
public class TF {

    // 分词
    public static List<Word> ansj(String str) {

        Set<String> Nature = new HashSet<String>();
        Nature.add("n");
        Nature.add("vn");  //只取n和vn两种词性 即名词和一部分动词
        Result result = ToAnalysis.parse(str); // 分词结果的一个封装，主要是一个List<Term>的terms

        List<Term> terms = result.getTerms(); // 拿到terms
        // System.out.println(terms.size());

        Map<String, Double> map = new HashMap<String, Double>();
        // 定义map来存储词汇名称和词的数量

        for (int i = 0; i < terms.size(); i++) {
            String word = terms.get(i).getName(); // 拿到词
            String natureStr = terms.get(i).getNatureStr(); // 拿到词性
            if (Nature.contains(natureStr)) // 判断set里有没有该词性，只取自己需要的
                map.put(word, map.getOrDefault(word, 0.0) + 1.0);
        }

        List<Word> list = new ArrayList<Word>();
        //word类的list存词汇名称以及暂时存一下词频

        for (String key : map.keySet()) {    // 便利map 计算词频
            Double ans = map.get(key);
            double tf = ans / terms.size();
            Word word = new Word(key, tf);
            list.add(word);
        }
//		Collections.sort(list); 这个地方实际没必要排序
        return list;
    }

    public static List<Word> FileRead(String text) {        //这里是对pdfbox的运用
        // 对PDF文件的读取
        String str = "";
        try {
//            File file = new File(path);
//            PDDocument document = PDDocument.load(file);
//            PDFTextStripper pdfStripper = new PDFTextStripper();
//            String text = pdfStripper.getText(document);

//            for (int i = 0; i < text.length(); i++) {
//                if (text.charAt(i) >= 0x4e00 && text.charAt(i) <= 0x9fbb)
//                    str += text.charAt(i);            //这块把所有不是汉字的过滤掉了
//            }
            text = text.replaceAll("\\\\", "");
            String regEx = "[`~!@#$%^&*() =|{}'.:;'\\[\\]<>/?~@#￥%……&*]";//+号表示空格
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(text);
            str = m.replaceAll("").trim();
//            System.out.println(str);
//            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ansj(str);
    }
}